package com.lycos.ludrien.client;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
import java.util.regex.Pattern;

import com.lycos.ludrien.main.StopList;

public class Requete {

	private String requete;
	protected ArrayList<String> listeMotsRequete;
	
	
	private void lireRequete(){
		Pattern p = Pattern.compile("\\b");
		Scanner scannerRequete = new Scanner(this.requete).useDelimiter(p);
		while (scannerRequete.hasNext()) {
			String motRequete = scannerRequete.next();
			if (Pattern.matches("(\\p{L}|\\d)*", motRequete) && motRequete.length() > 2 && (!StopList.compareWordsWithStopList(motRequete))) {

				motRequete = motRequete.toLowerCase();
				if (motRequete.length()>6) motRequete = motRequete.toLowerCase().substring(0,6);
				listeMotsRequete.add(motRequete);
			}
		}
		scannerRequete.close();
	}
	
	public Requete(String p_requete){
		this.listeMotsRequete = new ArrayList<String>();
		this.requete = p_requete;
		this.lireRequete();
	}
	
	public String getRequete(){
		return this.requete;
	}
	
	public Resultat traiter(){
		Resultat res = new Resultat();
	
		HashMap<Integer, LiaisonMotSimple> mot_liaison = new HashMap<Integer, LiaisonMotSimple>();
		
		
		// Cherche l'id des mots et lecture des liaisons
		for (String mot: listeMotsRequete){
			int idMot = Moteur.listeMots.getID(mot);
			mot_liaison.put(idMot, new LiaisonMotSimple(idMot, Moteur.getCon()));
		}
		
		
		// Pour chaque paragraphe
		for (int idPara: Moteur.listePara.getArrayIdPara()){
			
			
			double score = 0;
			int coeff = 0;
			String nomDoc = Moteur.listePara.getNomDoc(idPara);
			String chemin = Moteur.listePara.getChemin(idPara);
			
			// Pour chaque mot de la requete
			for (String mot: listeMotsRequete){
				int idMot = Moteur.listeMots.getID(mot);
				
				int frequence = mot_liaison.get(idMot).getFreq(idPara);

				boolean titre =  mot_liaison.get(idMot).getIsTitle(idPara);

				double idf = Moteur.listeMots.getIDF(mot);
				int poid = mot_liaison.get(idMot).getNbOccur(idPara);
				if (poid != 0) coeff++;
				double scoretmp =  frequence * idf * poid;
				
				//double scoretmp =  poid;
				
				if (titre) scoretmp *= 1.5;
				
				score += scoretmp;
			
			}
			if (coeff != 0)
				score = Math.pow(score, coeff);
			
			res.ajouterResultat(nomDoc, chemin, score);
		}
		
		return res;		
	}
		
}
